package com.sisgesbyte.dao.auditoria;

import java.util.List;

import javax.ejb.Stateless;
import javax.inject.Inject;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import com.sisgesbyte.dao.beanDao.FiltrosSQLBean;
import com.sisgesbyte.dao.beanDao.LogRequest;
import com.sisgesbyte.dao.utilDao.CreaFiltroSqlString;
import com.sisgesbyte.data.entity.auditoria.InsertaLogEntity;
import com.sisgesbyte.data.entity.auditoria.LogAccesoSistemaEntity;
import com.sisgesbyte.data.util.AbstractFacade;

@Stateless
public class AuditoriaDaoImpl extends AbstractFacade<InsertaLogEntity> implements AuditoriaDao{

	@PersistenceContext(unitName = "SigesSiscompPU")
	private EntityManager em;

	@Override
	protected EntityManager getEntityManager() {
		return em;
	}
	@Inject
	private CreaFiltroSqlString creaFiltroSqlString;
	
	public AuditoriaDaoImpl(){
		super(InsertaLogEntity.class);
	}
	
	@Override
	public List<LogAccesoSistemaEntity> listarLog(FiltrosSQLBean cadenaFiltros) {
		StringBuilder jpql = new StringBuilder();
			jpql.append("SELECT id, cod_transaccion, usuario, fecha_acceso, tipo_host, marca_host, ");
			jpql.append("navegador, ip_publica, ip_estatica, continente, pais, region, ");
			jpql.append("ciudad, lat_map, lng_map, empresa, active ");
			jpql.append("FROM auditoria.log_acceso ");
			
			//concatenamos el filtro
			if(cadenaFiltros != null){
				StringBuilder filtro = new StringBuilder();
				filtro.append(creaFiltroSqlString.concatenar(cadenaFiltros));
				jpql.append(filtro.toString());
			}
			Query query = em.createNativeQuery(jpql.toString(),LogAccesoSistemaEntity.class);
				
				if(cadenaFiltros != null && cadenaFiltros.getListaValores() != null && cadenaFiltros.getListaValores().size()> 0){
					int num = 0;
					for(Object valor : cadenaFiltros.getListaValores()){
						query.setParameter(++num, valor);
					}
				}
			
				List<LogAccesoSistemaEntity> ls = query.getResultList();
				
			return ls;
	}
	
	@Override
	public InsertaLogEntity registrarLog(LogRequest logRequest) {
		Query query = em.createNamedQuery("auditoria.registrarlog");
				query.setParameter("in_empresa", logRequest.getEmpresa());
				query.setParameter("in_usuario", logRequest.getUsuario());
				query.setParameter("in_metodo", logRequest.getMetodo());
				query.setParameter("in_cod_trans", logRequest.getCodtransaccion());
				query.setParameter("in_cod_error", logRequest.getCodError());
				query.setParameter("in_navegador", logRequest.getNavegador());
				query.setParameter("in_mensaje_error", logRequest.getMsjError());
		return (InsertaLogEntity)query.getSingleResult();
	}

	
}
